package exam.utils;

import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.*;


/**
 * 文件工具类
 * */
public class FileUtil {
    /**
     * 多文件上传方法
     * @param fileList      需要上传的文件数组
     * @param folderPath   存放的服务器目标文件
     * @return              map键值对，key为服务器文件地址，value为原文件名
     * */
    public static Map<String,String> upLoadFile(List<MultipartFile> fileList,String  folderPath){
        Map<String,String> fileMap = new HashMap<String,String>();
        //上传协议到服务器文件夹地址
        MultipartFile file = null;
        //BufferedOutputStream stream = null;
        for(int i=0;i<fileList.size();++i){
            file = fileList.get(i);
            if(!file.isEmpty()){

                try{
                    //上传到服务器后，混淆过后的名字
                    String newFile = upLoadFileSingle(file,folderPath);
                    String fileSrc = file.getOriginalFilename();
                    //System.out.println(newFile + " " + fileSrc);
                    fileMap.put(newFile,fileSrc);
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }
        return fileMap;
    }

    /**
     * 单文件上传
     * @param  file            需要上传的文件
     * @param  folderPath      存放文件的服务器地址
     * @return                上传文件名（混淆之后）
     * */
    public static String upLoadFileSingle(MultipartFile file,String folderPath){
        //新上传文件名
        String newFile = "";
        try{
            File filePath = new File(folderPath);
            if(!filePath.exists()){                  //若文件夹不存在则创建文件夹
                filePath.mkdir();
            }
            //获取文件后缀名
            //String suffixName = file.getOriginalFilename().substring(file.getOriginalFilename().indexOf("."));

            //UUID 生成新文件名称
            newFile = UUID.randomUUID().toString();

            File createNewFile = new File(folderPath + newFile);
            createNewFile.createNewFile();
            byte[] bytes = file.getBytes();
            BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(createNewFile));
            stream.write(bytes);
            stream.close();
        }catch (Exception e){
            e.printStackTrace();
        }
        return newFile;
    }

    /**
     * 下载文件
     * @param  respose
     * @param  folderPath      服务器文件地址
     * @param  fileName        文件名
     * */
    public static void downLoadFile(HttpServletResponse respose,String folderPath,String fileName,String fileNameSrc){
        File file = new File(folderPath,fileName);
        try{
            //解决文件名中文乱码问题
            fileNameSrc = java.net.URLEncoder.encode(fileNameSrc,"UTF-8");
        }catch (UnsupportedEncodingException e){
            e.printStackTrace();
        }

        if(file.exists()){
            respose.setContentType("application/force-download;charset=UTF-8");   //设置强制下载不打开
            respose.addHeader("Content-Disposition","attachment;fileName="+fileNameSrc);  //设置源文件名

            respose.setCharacterEncoding("UTF-8");
            byte[]  buffer = new byte[1024];
            FileInputStream fis = null;
            BufferedInputStream bis = null;
            try{
                /**
                 * 从服务器的文件里面，读取进入输入流，并放到输入流的缓冲区里
                 * 获取response输出流，将输出流一部分一部分的放到我们的输出流里面
                 * 完成response
                 * */
                fis = new FileInputStream(file);
                bis = new BufferedInputStream(fis);
                OutputStream os = respose.getOutputStream();
                int i = bis.read(buffer);
                while(i != -1){
                    os.write(buffer,0,i);
                    i = bis.read(buffer);
                }

            }catch (Exception e){
                e.printStackTrace();
            }finally {
                if(bis != null){
                    try{
                        bis.close();
                    }catch (IOException e){
                        e.printStackTrace();
                    }
                }
                if(fis != null){
                    try{
                        fis.close();
                    }catch (IOException e){
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}
